import * as commonUtil from '@/util/common'
export default {
  data() {
    return {
      // 所有格式化的类型列表
      formatTypeAllList: ['string', 'number', 'money', 'percent'],
      // 特殊列的类型
      specialColumns: ['index', 'expand', 'radio'],
      // 默认格式化配置
      defaultFormatConfig: {
        countryKey: 'countryCode',
        carryNumber: 0,
        fixNumber: 2
      },
      // 表头具有的padding 宽度
      labelPaddingWidth: 16 * 2,
      // 排序icon占据宽度
      labelSortableWidth: 0,
      // 提示icon占据宽度
      labelNoticWidth: 20
    }
  },
  methods: {
    // 获取兼容性后的 column scoped
    getCompatibleSlotScoped(scoped) {
      return {
        ...scoped,
        row: scoped.record,
        prop: scoped.column.prop,
        $index: scoped.index,
        $config: scoped.column
      }
    },
    // 根据 column config 获取默认值
    getColumnValOfConfig({ row, column, $index, $config }) {
      // 默认value计算
      let value = ''
      if (row && $config?.prop) {
        // 原始值
        const normalVal = row[$config.prop]
        // 针对特殊列
        if ($config.isSpecialColumnAuto) {
          return
        }
        // 格式化配置
        const formatConfig = {
          row,
          column,
          $index,
          $config,
          prop: $config.prop,
          formatFun: commonUtil.getColFormatValue
        }
        if ($config.isFormat) {
          const format = $config.format
          if (format) {
            if (typeof format === 'function') {
              value = format(formatConfig)
            } else {
              throw Error(
                'In TypeColumn Component , format prop type must be Function'
              )
            }
          } else {
            // 接入prop 格式化函数  提供table 与 column的全局关联
            switch ($config.formatType) {
              case 'number':
                value = this.formatNumber(formatConfig)
                break
              case 'percent':
                value = this.formatPercent(formatConfig)
                break
              case 'money':
                value = this.formatMoney(formatConfig)
                break
              default:
                value = normalVal
                break
            }
            // 添加格式化补丁函数钩子
            if (
              $config.formatPatch &&
              typeof $config.formatPatch === 'function'
            ) {
              const formatVal = value
              const proxyFormatObj = Object.assign({ formatVal }, formatConfig)
              value = $config.formatPatch(proxyFormatObj)
            }
          }
          // 添加格式化拦截函数钩子
          if (
            $config.formatProxy &&
            typeof $config.formatProxy === 'function'
          ) {
            const formatVal = value
            const proxyFormatObj = Object.assign({ formatVal }, formatConfig)
            value = $config.formatProxy(proxyFormatObj)
          }
        } else {
          // 原始值
          value = normalVal
        }
      }
      return value
    },
    // 数字格式化函数
    formatNumber({ row, $config }) {
      const { formatConfig } = $config
      return commonUtil.getColFormatValue(row[$config.prop], 'number', null, {
        ...formatConfig
      })
    },
    // 百分比格式化函数
    formatPercent({ row, $config }) {
      const { formatConfig } = $config
      return commonUtil.getColFormatValue(row[$config.prop], 'percent', null, {
        ...formatConfig
      })
    },
    // 金钱格式化函数
    formatMoney({ row, prop, $config }) {
      const { formatConfig } = $config
      // 货币符号
      const { countrySymbol, countryKey } = formatConfig
      // 国家符号
      const _countrySymbol = countrySymbol || row[countryKey]
      return commonUtil.getColFormatValue(row[prop], 'money', _countrySymbol, {
        ...formatConfig
      })
    }
  }
}
